package de.digitalcollections.iiif.presentation.model.impl.jackson.deserializer.v2;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TextNode;
import de.digitalcollections.iiif.presentation.model.api.v2.PropertyValue;
import de.digitalcollections.iiif.presentation.model.impl.v2.PropertyValueLocalizedImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.PropertyValueSimpleImpl;
import java.io.IOException;
import java.util.Locale;
public class PropertyValueDeserializer extends JsonDeserializer<PropertyValue> implements ContextualDeserializer {
private JavaType valueType;
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
JavaType wrapperType = property.getType();
JavaType valueType = wrapperType.containedType(0);
PropertyValueDeserializer deserializer = new PropertyValueDeserializer();
deserializer.valueType = valueType;
return deserializer;
}
@Override
public PropertyValue deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
TreeNode node = mapper.readTree(jp);
if (TextNode.class.isAssignableFrom(node.getClass())) {
return new PropertyValueSimpleImpl(((TextNode) node).textValue());
} else if (ObjectNode.class.isAssignableFrom(node.getClass())) {
ObjectNode obj = (ObjectNode) node;
String language = ((TextNode) node.get("@language")).textValue();
String value = ((TextNode) node.get("@value")).textValue();
return new PropertyValueLocalizedImpl(Locale.forLanguageTag(language), value);
} else if (ArrayNode.class.isAssignableFrom(node.getClass())) {
ArrayNode arr = (ArrayNode) node;
ObjectNode curObj;
PropertyValueLocalizedImpl propVal = new PropertyValueLocalizedImpl();
for (int i = 0; i < arr.size(); i++) {
if (ObjectNode.class.isAssignableFrom(arr.get(i).getClass())) {
curObj = (ObjectNode) arr.get(i);
propVal.addValue(((TextNode) curObj.get("@language")).textValue(),
((TextNode) curObj.get("@value")).textValue());
} else if (TextNode.class.isAssignableFrom(arr.get(i).getClass())) {
propVal.addValue("", ((TextNode) arr.get(i)).asText());
}
}
return propVal;
}
return null;
}
}